package com.fuze.questionnaire.controller;

import com.fuze.questionnaire.common.Advice;
import com.fuze.questionnaire.common.CustomException;
import com.fuze.questionnaire.common.Result;
import com.fuze.questionnaire.domain.dto.UserResultDTO;
import com.fuze.questionnaire.service.UserResultService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author sepc_
 * @date 10/20/2021 15:10
 * 用户-选项 Controller
 */
@RestController
@RequiredArgsConstructor
@Slf4j
@Api(tags = "用户答案API")
public class UserResultController {

    final UserResultService userResultService;

    /**
     * 批量提交用户的答案（这里的批量提交只是提交到了Redis中）
     *
     * @param resultForms 用户的答案列表
     * @param userId      用户ID
     * @return 是否提交成功
     * <p>
     * TODO: 2022-02-10 这里批量提交的数据是到了Redid中，是否需要持久化同步到MySQL中？？
     * 需要的话，思路：用户点击提交的时候，从Redis中取出数据，同步插入到MySQL中
     * 注意由于用户可以重复提交，需要注意是第几次提交的，
     * 所以表设计中需要添加一个version字段用于判断用户区分用户是第几次提交（这样做可以获得全量的数据，但是存在数据冗余）
     * 也可以每次都更新用户的数据，只保留最新的数据（这种做法其实并不需要MySQL，因为Redis中保存的永远是最新的数据）
     */
    @ApiOperation(value = "批量提交用户答案接口")
    @PostMapping("/submitBatch/{userId:\\d+}")
    public Result submitBatch(@RequestBody List<UserResultDTO> resultForms, @PathVariable("userId") Integer userId) {
        // 这个HashMap是为了去重前端返回的数据
        HashMap<Integer, String> map = new HashMap<>();
        resultForms.forEach(r -> map.put(r.getProblemId(), r.getOptionsResult()));
        ArrayList<UserResultDTO> list = new ArrayList<>();
        map.forEach((key, value) -> list.add(new UserResultDTO(key, value)));
        Boolean submitList = userResultService.submitList(list, userId);
        if (Boolean.TRUE.equals(submitList)) {
            return Result.ok();
        }
        throw new CustomException(Advice.FAILED_INSERT);
    }

    /**
     * 根据用户id把redis中的数据存到数据库
     *
     * @param userId 用户id
     * @return 是否提交成功
     */
    @ApiOperation(value = "批量把redis中的数据存到数据库中")
    @PostMapping("/submitAll/{userId:\\d+}")
    public Result submitAll(@PathVariable("userId") Integer userId) {
        return Result.ok(userResultService.submitAll(userId));
    }


    /**
     * 根据用户id查询用户的问卷答案
     *
     * @param userId 用户id
     * @return 一个用户的问卷答案
     */
    @ApiOperation("查询用户提交的问卷答案接口")
    @GetMapping("/queryAnswer/{userId:\\d+}/{type:\\d+}")
    public Result queryAnswer(@PathVariable(value = "userId") Integer userId, @PathVariable(value = "type") Integer type) {
        return Result.ok(userResultService.queryAnswer(userId, type));
    }

}
